
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using ProduceBasicData.Domain.Entities;

namespace ProduceBasicData.Infrastructure.Interface
{
    public interface IBaseRespository<T> where T : BaseEntity
    {
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        Task<int> AddAsync(T t);

        /// <summary>
        /// 新增并获取id
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        Task<int> AddAndGetIdAsync(T entity);

        /// <summary>
        /// 批量新增
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        Task<int> AddRangeAsync(List<T> t);

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        Task<int> Update(T t);
        /// <summary>
        /// 批量更新
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        Task<int>UpdateRange(IList<T> t);

        /// <summary>
        /// 获取所有
        /// </summary>
        /// <returns></returns>
        IQueryable<T> GetAll();
        Task<T> GetFirstOrDefaultAsync();
        /// <summary>
        /// 根据条件查询单条数据
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <returns>符合条件的实体或null</returns>
        Task<T> GetFirstOrDefaultAsync(Expression<Func<T, bool>> predicate);

        /// <summary>
        /// 异步查询 - 获取所有实体列表
        /// </summary>
        /// <returns>所有实体列表</returns>
        Task<List<T>> GetAllAsync();
        // 添加带条件的异步查询方法
        Task<List<T>> GetAllAsync(Expression<Func<T, bool>> predicate);

        /// <summary>
        /// 根据id查询
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<T> GetModelAsync(int id);
        Task<List<T>> GetRangeAsync(int[] ids);
        /// <summary>
        /// 事务
        /// </summary>
        /// <returns></returns>
        MyDBContext DB { get; }

        // 新增：仅添加实体，不自动保存（用于事务内）
        Task AddNoSaveAsync(T t);

        // 新增：仅批量添加实体，不自动保存（用于事务内）
        Task AddRangeNoSaveAsync(List<T> t);

        // 新增：仅更新实体，不自动保存（用于事务内）
        void UpdateNoSave(T t);

        // 新增：仅批量更新实体，不自动保存（用于事务内）
        void UpdateRangeNoSave(IList<T> t);

        // 新增：手动触发保存（用于事务内统一提交）
        Task<int> SaveChangesAsync();
        // 1. 先在 IBaseRespository<T> 接口新增方法
        Task<bool> AnyAsync(Expression<Func<T, bool>> predicate);

    }
}
